/**
 * 用户注册路由模块
 * @author HalRui
 * @version 1.0.0
 * @description 处理用户注册相关的API请求，包括邮箱验证、验证码发送、用户注册等功能
 * @date 2025年9月27日
 */

const express = require('express');
const router = express.Router();
// 引入用户信息操作API模块，提供用户数据的增删改查功能
const userinfosAPI = require("../../libs/userinfos-api");
// 引入邮箱验证中间件，用于验证邮箱格式的合法性
const emailValidator = require("../../middlewares/email-validator-middleware");
// 引入工具服务模块，提供验证码生成、邮件发送等辅助功能
const toolService = require("../../utils/tool-service");
// 引入Redis操作API模块，用于缓存验证码、令牌等数据
const redisAPI = require("../../libs/redis-api");
// 引入状态码常量模块，统一定义API返回的状态码和消息文本
const STATUS_CODES = require("../../utils/status-codes");


// 定义邮箱验证路由 - POST /verify-mail
// 用于检查邮箱是否已被注册
router.post('/verify-mail',
    emailValidator.validateEmail,  // 使用邮箱验证中间件验证邮箱格式
    async (req, res, next)=> {
        const mail = req.body?.mail;  // 从前端表单数据中获取邮箱地址

        // 调用用户信息API检查邮箱是否已存在
        const result = await userinfosAPI.verifyEmail(mail);

        // 如果邮箱已存在，返回邮箱已被使用的状态码
        if (result.success) {
            return res.json({
                code: STATUS_CODES.EMAIL_ALREADY_USED.code,      // 使用状态码常量：邮箱已被使用
                message: STATUS_CODES.EMAIL_ALREADY_USED.message  // 对应的消息文本
            })
        } else {
            // 如果邮箱不存在，返回成功状态码（表示邮箱可用）
            return res.json({
                code: STATUS_CODES.SUCCESS.code,      // 使用状态码常量：操作成功
                message: "邮箱可用"   // 明确的邮箱可用消息
            })
        }
    });

// 定义发送邮箱验证码路由 - POST /send-code
// 用于向指定邮箱发送验证码
router.post("/send-code",
    emailValidator.validateEmail,  // 使用邮箱验证中间件验证邮箱格式
    async  (req, res)=> {
        const mail = req.body?.mail;  // 从前端表单数据中获取邮箱地址

        // 生成8位数字验证码
        const code = toolService.createCode(8);

        // 将验证码保存到Redis缓存中，设置过期时间
        const saveResult = await redisAPI.saveEmailCode(mail, code);

        if (!saveResult.success) {
            // 如果保存失败，返回发送失败状态码
            return res.json({
                code: STATUS_CODES.EMAIL_CODE_SEND_FAILED.code,      // 使用状态码常量：邮箱验证码发送失败
                message: STATUS_CODES.EMAIL_CODE_SEND_FAILED.message   // 对应的消息文本
            });
        }

        // 调用邮件服务发送验证码到用户邮箱，设置3秒超时
        try {
            const info = await Promise.race([
                toolService.sendMailCode(mail, code),
                new Promise((_, reject) => 
                    setTimeout(() => reject(new Error('邮件发送超时')), 3000)
                )
            ]);

            if(info.success){ // 邮件发送成功
                // 返回成功响应，包含邮箱地址信息
                res.json({
                    code: STATUS_CODES.SUCCESS.code,      // 使用状态码常量：操作成功
                    message: "邮箱验证码发送成功",           // 自定义成功消息
                    data: { email: mail }                 // 返回邮箱地址数据
                })
            }else{ // 邮件发送失败
                // 返回发送失败状态码
                res.json({
                    code: STATUS_CODES.EMAIL_CODE_SEND_FAILED.code,      // 使用状态码常量：邮箱验证码发送失败
                    message: STATUS_CODES.EMAIL_CODE_SEND_FAILED.message   // 对应的消息文本
                })
            }
        } catch (error) {
            // 邮件发送超时或异常，但验证码已保存到Redis，返回成功
            console.log(`邮件发送失败但验证码已保存: ${error.message}`);
            res.json({
                code: STATUS_CODES.SUCCESS.code,
                message: "验证码已生成，请查收邮件（如未收到请稍后重试）",
                data: { email: mail }
            });
        }
    })

// 定义用户注册路由 - POST /sign-up
// 用于处理新用户注册，包括验证码验证和密码确认
router.post("/sign-up",
    emailValidator.validateEmail,  // 使用邮箱验证中间件验证邮箱格式
    async (req, res) => {
        // 从前端表单数据中获取注册信息：邮箱、验证码、密码、确认密码
        let {
            mail,           // 必需：邮箱地址
            code,           // 必需：验证码
            pass,           // 必需：密码
            confirm         // 必需：确认密码
        } = req.body;

        // 从Redis中获取该邮箱对应的验证码
        const redisCodeResult = await redisAPI.getEmailCode(mail); //过去以后返回null对象

        // 验证验证码是否正确或是否已过期（忽略大小写）
        if(!redisCodeResult.success || code.toLowerCase() !== redisCodeResult.message?.toLowerCase()){// 验证码输入错误（忽略大小写）
            return res.json({
                code: STATUS_CODES.EMAIL_CODE_INVALID.code,      // 20004: 邮箱验证码不正确
                message: STATUS_CODES.EMAIL_CODE_INVALID.message   // 邮箱验证码不正确
            })
        }

        // 验证两次输入的密码是否一致
        if(pass !== confirm){
            return res.json({
                code: STATUS_CODES.PASSWORD_NOT_MATCH.code,      // 20005: 两次输入的密码不一致
                message: STATUS_CODES.PASSWORD_NOT_MATCH.message   // 两次输入的密码不一致
            })
        }

        // 验证密码强度：至少8位，包含字母和数字
        const passwordRegex = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*#?&.])[A-Za-z\d@$!%*#?&_.]{8,}$/;
        

        
        if (!passwordRegex.test(pass)) {
            return res.json({
                code: STATUS_CODES.PASSWORD_FORMAT_INVALID.code || 20006,      // 密码格式不正确
                message: "密码至少8位，必须包含字母和数字"
            })
        }



        // 获取用户注册IP地址
        const registeredIp = req.ip || req.connection.remoteAddress;

        // 构建用户数据对象，使用默认值
        const userData = {
            email: mail,
            password: pass,
            username: null,                // 默认为空
            nickname: null,                // 默认为空
            phone: null,                   // 默认为空
            gender: 'secret',              // 默认为secret
            birthday: null,                // 默认为空
            description: null,             // 默认为空
            avatar: '/public/images/default-avatar.png', // 默认头像
            registeredIp: registeredIp,    // 记录注册IP
            userType: 'customer',          // 默认为普通用户
            status: 'active',              // 默认为激活状态
            userLevel: 0,                  // 默认等级为0
            points: 0,                     // 默认积分为0
            balance: 0,                    // 默认余额为0
            totalSpent: 0,                 // 默认总消费为0
            totalOrders: 0                 // 默认总订单数为0
        };

        // 将用户数据存储到MongoDB数据库 - 使用封装的用户创建功能
        const result = await userinfosAPI.saveUserInfo(userData)
        
        // 注册成功后清理Redis中的邮箱验证码，防止重复使用
        await redisAPI.dropEmailCode(`email_code:${mail}`);

        if(result.success){
            // 注册成功，返回用户信息
            return res.json({
                code: STATUS_CODES.SUCCESS.code,      // 0: 操作成功
                message: "注册成功",                     // 自定义成功消息
                data : {                                // 返回用户基本信息
                    email : result.message.email,       // 用户邮箱
                    userId : result.message.userId,     // 用户业务ID
                    username : result.message.username, // 用户名
                    nickname : result.message.nickname, // 昵称
                    avatar : result.message.avatar,     // 头像
                    createAt : result.message.createAt  // 创建时间
                }
            })
        }else{
            // 注册失败，返回错误信息
            return res.json({
                code: STATUS_CODES.REGISTER_FAILED.code,      // 10001: 注册失败
                message: result.message || STATUS_CODES.REGISTER_FAILED.message   // 注册失败
            })
        }
    })



module.exports = router